/* system sleep*/
#include <unistd.h>

#include <iostream>
/* core lib*/
#include "module.hxx"
#include "modules.hxx"
#include "module_list.hxx"
/* log */
#include "minilog_static.hxx"

#include "util.hxx"

/* Socket */
#define AS_SOCKET_SERVER
#define AS_SOCKET_CLIENT
#include "as_socket.hxx"

/* modules*/
#include "module_demo.hxx"

void server_keepalive(void *arg)
{
    string str((char*)arg);
    LogD(__FILE__, __LINE__, str);
}

int runAsServer(void)
{
    class TestModulesManager modluesManager;
    class AsSocketServer server;
    char buff[] = "I am a callback arg";

    server.addRunningCB(server_keepalive, buff);
    /* 添加测试模块（以初始化函数列表的形式） */
    //modluesManager.insertModulesByMethodList(getModuleMethodArray());
    /* 添加测试模块（以结构体列表配置的形式） */
    modluesManager.insertModules(getModuleList());

#if 0
    /* 运行模块*/
    //modluesManager.findModule("demo");
    modluesManager.execModuleByName("demo");
    modluesManager.execAllModules();
#endif

#if 0
    modluesManager.handleRequest("tinymmi -m run -c demo -v 'hello demo'");
    modluesManager.handleRequest("tinymmi -m set -c demo -v 'ok'");
    return 0;
#else
    return server.exec(&modluesManager);
#endif
}

int runAsClient(const string & run_mode, const string & cmd, const string & set_value)
{
    class AsSocketClient client;

    return client.sendRequest2Server(run_mode, cmd, set_value);
}


#if 0
执行格式（服务端） 不需要带参数

执行格式（客户端） 格式要求
     -m run/get/set -c module-name [set-value, 'ok' or other]
 例如
     -m run  -c demo
     -m get  -c demo
     -m set  -c demo -v no
     -m get  -c demo
     -m set  -c demo -v ok
     -m get  -c demo
#endif
int main(int argc, char *argv[])
{
    std::string run_mode, cmd, set_value;

    LogInit(MiniLog::DEBUG);

    // 如果有参数传递，则解析
    if(argc > 1)
    {
        //bool usingConfig = false;
        int ret;
        string addr;
        // 解析 : 模块动作， 模块参数， 参数值， [服务器地址]
        ret = parseCarg(argc, argv, run_mode, cmd, set_value, addr);
        if(ret) return ret;
        LogD(__FILE__, __LINE__, "run mode", run_mode);
        LogD(__FILE__, __LINE__, "cmd", cmd);
        if(addr != "")
            socketTrySetaddress(addr);

        if(run_mode == "")
        {
            ret = runAsServer();
        }else {
            ret = runAsClient(run_mode, cmd, set_value);
        }
        return ret;
    }

    // 默认情况下，作为server运行
    return runAsServer();
}
